package com.zyg.manager.service.impl;

import com.zyg.manager.dao.SpecificationOptionDao;
import com.zyg.manager.entity.SpecificationOptionEntity;
import com.zyg.manager.entity.group.Specification;
import com.zyg.manager.service.SpecificationOptionService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zyg.common.utils.PageUtils;
import com.zyg.common.utils.Query;

import com.zyg.manager.dao.SpecificationDao;
import com.zyg.manager.entity.SpecificationEntity;
import com.zyg.manager.service.SpecificationService;


@Service("specificationService")
public class SpecificationServiceImpl extends ServiceImpl<SpecificationDao, SpecificationEntity> implements SpecificationService {

    @Autowired
    private SpecificationOptionDao sod;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        //1. 获取查询条件
        String key = (String) params.get("key");
        //2. 实例查询包装对象
        QueryWrapper<SpecificationEntity> wrapper = new QueryWrapper<>();
        //3. 判断是否有条件，如果有添加为查询条件
        if(StringUtils.isNotBlank(key)){
            //3.1 查询条件1(id) 精确查询
            wrapper.eq("id",key);
            //3.2 查询条件2（spec_name） 模糊查询
            wrapper.or().like("spec_name",key);
        }
        IPage<SpecificationEntity> page = this.page(
                new Query<SpecificationEntity>().getPage(params),
                wrapper
        );
        return new PageUtils(page);
    }

    /**
     * 作者：LMY
     * 功能：添加规格与规格项
     * 时间：2021/10/25 21:54
     */
    @Override
    public void insert(Specification specification) {
        //1. 先拿到规格对象
        SpecificationEntity spec = specification.getSpec();
        //2. 添加规格对象到数据库
        baseMapper.insert(spec);
        System.out.println("id啊啊啊 = " + spec.getId());
        //3. 拿到对应的规格项集合
        for (SpecificationOptionEntity o : specification.getOptions()) {
            //3.1 将规格id作为外键添加到数学中
            o.setSpecId(spec.getId());
            //3.2 执行添加
            sod.insert(o);
        }
    }

    @Override
    public Specification findById(Long id) {
        //1. 通过主键id查出规格
        SpecificationEntity spec = baseMapper.selectById(id);
        //2. 封装查询条件
        QueryWrapper<SpecificationOptionEntity> wrapper = new QueryWrapper();
        wrapper.eq("spec_id", id);
        //3. 开始查询
        List<SpecificationOptionEntity> options = sod.selectList(wrapper);
        //4. 返回封装对象
        return new Specification(spec, options);
    }

    /**
     * 作者：LMY
     * 功能：修改规格及，规格选项
     * 时间：2021/10/26 16:51
     */
    @Override
    public void updSpec(Specification specification) {
        //1. 取出规格对象
        SpecificationEntity spec = specification.getSpec();
        //2. 封装删除条件
        QueryWrapper<SpecificationOptionEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("spec_id", spec.getId());
        //3. 执行删除,删除规格对象对应的多个规格选项
        sod.delete(wrapper);
        //4. 修改规格
        baseMapper.updateById(spec);
        //5. 归选项绑定外键，执行添加
        for (SpecificationOptionEntity option : specification.getOptions()) {
            //5.1 绑定外键
            option.setSpecId(spec.getId());
            //5.2 执行添加
            sod.insert(option);
        }
    }

    /**
     * 作者：LMY
     * 功能：删除规格，及对应的规格选项
     * 时间：2021/10/26 17:04
     */
    @Override
    public void delete(List<Long> ids) {
        //1. 遍历所有id
        ids.forEach(id->{
            //1.1 删除规格
            baseMapper.deleteById(id);
            //1.2 删除规格选项
            sod.delete(new QueryWrapper<SpecificationOptionEntity>().eq("spec_id",id));
        });
    }

}